1   package io.vavr.collection;
2   
3   import io.vavr.Value;
4   import org.assertj.core.api.Assertions;
5   import org.junit.Test;
6   
7   import java.math.BigDecimal;
8   import java.util.ArrayList;
9   import java.util.Spliterator;
10  import java.util.function.Function;
11  import java.util.function.Supplier;
12  import java.util.stream.Collector;
13  
14  public class LinkedHashSetTest extends AbstractSetTest {
15  
16      @Override
17      protected <T> Collector<T, ArrayList<T>, LinkedHashSet<T>> collector() {
18          return LinkedHashSet.collector();
19      }
20  
21      @Override
22      protected <T> LinkedHashSet<T> empty() {
23          return LinkedHashSet.empty();
24      }
25  
26      @Override
27      protected <T> LinkedHashSet<T> emptyWithNull() {
28          return empty();
29      }
30  
31      @Override
32      protected <T> LinkedHashSet<T> of(T element) {
33          return LinkedHashSet.of(element);
34      }
35  
36      @SuppressWarnings("varargs")
37      @SafeVarargs
38      @Override
39      protected final <T> LinkedHashSet<T> of(T... elements) {
40          return LinkedHashSet.of(elements);
41      }
42  
43      @Override
44      protected boolean useIsEqualToInsteadOfIsSameAs() {
45          return false;
46      }
47  
48      @Override
49      protected int getPeekNonNilPerformingAnAction() {
50          return 1;
51      }
52  
53      @Override
54      protected <T> LinkedHashSet<T> ofAll(Iterable<? extends T> elements) {
55          return LinkedHashSet.ofAll(elements);
56      }
57  
58      @Override
59      protected <T extends Comparable<? super T>> LinkedHashSet<T> ofJavaStream(java.util.stream.Stream<? extends T> javaStream) {
60          return LinkedHashSet.ofAll(javaStream);
61      }
62  
63      @Override
64      protected LinkedHashSet<Boolean> ofAll(boolean... elements) {
65          return LinkedHashSet.ofAll(elements);
66      }
67  
68      @Override
69      protected LinkedHashSet<Byte> ofAll(byte... elements) {
70          return LinkedHashSet.ofAll(elements);
71      }
72  
73      @Override
74      protected LinkedHashSet<Character> ofAll(char... elements) {
75          return LinkedHashSet.ofAll(elements);
76      }
77  
78      @Override
79      protected LinkedHashSet<Double> ofAll(double... elements) {
80          return LinkedHashSet.ofAll(elements);
81      }
82  
83      @Override
84      protected LinkedHashSet<Float> ofAll(float... elements) {
85          return LinkedHashSet.ofAll(elements);
86      }
87  
88      @Override
89      protected LinkedHashSet<Integer> ofAll(int... elements) {
90          return LinkedHashSet.ofAll(elements);
91      }
92  
93      @Override
94      protected LinkedHashSet<Long> ofAll(long... elements) {
95          return LinkedHashSet.ofAll(elements);
96      }
97  
98      @Override
99      protected LinkedHashSet<Short> ofAll(short... elements) {
100         return LinkedHashSet.ofAll(elements);
101     }
102 
103     @Override
104     protected <T> LinkedHashSet<T> tabulate(int n, Function<? super Integer, ? extends T> f) {
105         return LinkedHashSet.tabulate(n, f);
106     }
107 
108     @Override
109     protected <T> LinkedHashSet<T> fill(int n, Supplier<? extends T> s) {
110         return LinkedHashSet.fill(n, s);
111     }
112 
113     @Override
114     protected LinkedHashSet<Character> range(char from, char toExclusive) {
115         return LinkedHashSet.range(from, toExclusive);
116     }
117 
118     @Override
119     protected LinkedHashSet<Character> rangeBy(char from, char toExclusive, int step) {
120         return LinkedHashSet.rangeBy(from, toExclusive, step);
121     }
122 
123     @Override
124     protected LinkedHashSet<Double> rangeBy(double from, double toExclusive, double step) {
125         return LinkedHashSet.rangeBy(from, toExclusive, step);
126     }
127 
128     @Override
129     protected LinkedHashSet<Integer> range(int from, int toExclusive) {
130         return LinkedHashSet.range(from, toExclusive);
131     }
132 
133     @Override
134     protected LinkedHashSet<Integer> rangeBy(int from, int toExclusive, int step) {
135         return LinkedHashSet.rangeBy(from, toExclusive, step);
136     }
137 
138     @Override
139     protected LinkedHashSet<Long> range(long from, long toExclusive) {
140         return LinkedHashSet.range(from, toExclusive);
141     }
142 
143     @Override
144     protected LinkedHashSet<Long> rangeBy(long from, long toExclusive, long step) {
145         return LinkedHashSet.rangeBy(from, toExclusive, step);
146     }
147 
148     @Override
149     protected LinkedHashSet<Character> rangeClosed(char from, char toInclusive) {
150         return LinkedHashSet.rangeClosed(from, toInclusive);
151     }
152 
153     @Override
154     protected LinkedHashSet<Character> rangeClosedBy(char from, char toInclusive, int step) {
155         return LinkedHashSet.rangeClosedBy(from, toInclusive, step);
156     }
157 
158     @Override
159     protected LinkedHashSet<Double> rangeClosedBy(double from, double toInclusive, double step) {
160         return LinkedHashSet.rangeClosedBy(from, toInclusive, step);
161     }
162 
163     @Override
164     protected LinkedHashSet<Integer> rangeClosed(int from, int toInclusive) {
165         return LinkedHashSet.rangeClosed(from, toInclusive);
166     }
167 
168     @Override
169     protected LinkedHashSet<Integer> rangeClosedBy(int from, int toInclusive, int step) {
170         return LinkedHashSet.rangeClosedBy(from, toInclusive, step);
171     }
172 
173     @Override
174     protected LinkedHashSet<Long> rangeClosed(long from, long toInclusive) {
175         return LinkedHashSet.rangeClosed(from, toInclusive);
176     }
177 
178     @Override
179     protected LinkedHashSet<Long> rangeClosedBy(long from, long toInclusive, long step) {
180         return LinkedHashSet.rangeClosedBy(from, toInclusive, step);
181     }
182 
183     @Test
184     public void shouldKeepOrder() {
185         final List<Integer> actual = LinkedHashSet.<Integer> empty().add(3).add(2).add(1).toList();
186         assertThat(actual).isEqualTo(List.of(3, 2, 1));
187     }
188 
189     // -- static narrow
190 
191     @Test
192     public void shouldNarrowLinkedHashSet() {
193         final LinkedHashSet<Double> doubles = of(1.0d);
194         final LinkedHashSet<Number> numbers = LinkedHashSet.narrow(doubles);
195         final int actual = numbers.add(new BigDecimal("2.0")).sum().intValue();
196         assertThat(actual).isEqualTo(3);
197     }
198 
199     // -- replace
200 
201     @Test
202     public void shouldReturnSameInstanceIfReplacingNonExistingElement() {
203         final Set<Integer> set = LinkedHashSet.of(1, 2, 3);
204         final Set<Integer> actual = set.replace(4, 0);
205         assertThat(actual).isSameAs(set);
206     }
207 
208     @Test
209     public void shouldPreserveOrderWhenReplacingExistingElement() {
210         final Set<Integer> set = LinkedHashSet.of(1, 2, 3);
211         final Set<Integer> actual = set.replace(2, 0);
212         final Set<Integer> expected = LinkedHashSet.of(1, 0, 3);
213         assertThat(actual).isEqualTo(expected);
214         Assertions.assertThat(List.ofAll(actual)).isEqualTo(List.ofAll(expected));
215     }
216 
217     @Test
218     public void shouldPreserveOrderWhenReplacingExistingElementAndRemoveOtherIfElementAlreadyExists() {
219         final Set<Integer> set = LinkedHashSet.of(1, 2, 3, 4, 5);
220         final Set<Integer> actual = set.replace(2, 4);
221         final Set<Integer> expected = LinkedHashSet.of(1, 4, 3, 5);
222         assertThat(actual).isEqualTo(expected);
223         Assertions.assertThat(List.ofAll(actual)).isEqualTo(List.ofAll(expected));
224     }
225 
226     @Test
227     public void shouldReturnSameInstanceWhenReplacingExistingElementWithIdentity() {
228         final Set<Integer> set = LinkedHashSet.of(1, 2, 3);
229         final Set<Integer> actual = set.replace(2, 2);
230         assertThat(actual).isSameAs(set);
231     }
232 
233     // -- transform
234 
235     @Test
236     public void shouldTransform() {
237         final String transformed = of(42).transform(v -> String.valueOf(v.get()));
238         assertThat(transformed).isEqualTo("42");
239     }
240 
241     // -- toLinkedSet
242 
243     @Test
244     public void shouldReturnSelfOnConvertToLinkedSet() {
245         final Value<Integer> value = of(1, 2, 3);
246         assertThat(value.toLinkedSet()).isSameAs(value);
247     }
248 
249     // -- spliterator
250 
251     @Test
252     public void shouldNotHaveSortedSpliterator() {
253         assertThat(of(1, 2, 3).spliterator().hasCharacteristics(Spliterator.SORTED)).isFalse();
254     }
255 
256     @Test
257     public void shouldHaveOrderedSpliterator() {
258         assertThat(of(1, 2, 3).spliterator().hasCharacteristics(Spliterator.ORDERED)).isTrue();
259     }
260 
261     // -- isSequential()
262 
263     @Test
264     public void shouldReturnTrueWhenIsSequentialCalled() {
265         assertThat(of(1, 2, 3).isSequential()).isTrue();
266     }
267 
268 }